package gui.panel;
import gui.UserGUI;
import javax.swing.JPanel;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JLabel;
import javax.swing.LayoutStyle.ComponentPlacement;
import java.awt.Color;
import javax.swing.JScrollPane;
import javax.swing.border.TitledBorder;
import javax.swing.text.MaskFormatter;
import javax.swing.JComboBox;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JTextField;
import javax.swing.JFormattedTextField;
import javax.swing.JButton;
import javax.swing.UIManager;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import Packet.SMSPacket;
import javax.swing.JSplitPane;
import javax.swing.JTextArea;
public class SMSLogPanel extends JPanel {
public static Color IN_SMS = new Color(14,92,7);
public static Color OUT_SMS = Color.blue;
private JTextArea areaKeyword;
private JFormattedTextField formattedMinDate;
private JFormattedTextField formattedMaxDate;
private JComboBox sourceBox;
private JComboBox typeBox;
private ColorPane colorPane;
private JTextField phoneNumberField;
private UserGUI gui;
/**
* Create the panel.
*/
public SMSLogPanel(UserGUI gui) {
this.gui = gui;
JLabel lblTypes = new JLabel("Types :");
JLabel lblIncoming = new JLabel("received SMS");
lblIncoming.setForeground(IN_SMS);
JLabel lblSent = new JLabel("sent SMS");
lblSent.setForeground(OUT_SMS);
JSplitPane splitPane = new JSplitPane();
splitPane.setResizeWeight(1.0);
GroupLayout groupLayout = new GroupLayout(this);
groupLayout.setHorizontalGroup(
groupLayout.createParallelGroup(Alignment.LEADING)
.addGroup(groupLayout.createSequentialGroup()
.addContainerGap()
.addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
.addGroup(groupLayout.createSequentialGroup()
.addComponent(splitPane, GroupLayout.DEFAULT_SIZE, 579, Short.MAX_VALUE)
.addContainerGap())
.addGroup(groupLayout.createSequentialGroup()
.addComponent(lblTypes)
.addGap(29)
.addComponent(lblIncoming)
.addGap(42)
.addComponent(lblSent))))
);
groupLayout.setVerticalGroup(
groupLayout.createParallelGroup(Alignment.LEADING)
.addGroup(groupLayout.createSequentialGroup()
.addContainerGap()
.addGroup(groupLayout.createParallelGroup(Alignment.BASELINE)
.addComponent(lblTypes)
.addComponent(lblIncoming)
.addComponent(lblSent))
.addPreferredGap(ComponentPlacement.RELATED)
.addComponent(splitPane)
.addContainerGap())
);
JScrollPane scrollPane = new JScrollPane();
splitPane.setLeftComponent(scrollPane);
colorPane = new ColorPane();
scrollPane.setViewportView(colorPane);
JPanel panel = new JPanel();
splitPane.setRightComponent(panel);
panel.setBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), "Optionnal filters", TitledBorder.LEADING, TitledBorder.TOP, null, null));
JLabel lblTypeOfCall = new JLabel("Source SMS :");
sourceBox = new JComboBox();
sourceBox.setModel(new DefaultComboBoxModel(new String[] {"All", "Received", "Sent"}));
JLabel lblPhoneNumber = new JLabel("Phone number :");
phoneNumberField = new JTextField();
phoneNumberField.setColumns(10);
JLabel lblMinDate = new JLabel("Not before (dd/mm/yyyy) :");
formattedMinDate = new JFormattedTextField(createFormatter("**/**/****"));
JLabel lblNotAfter = new JLabel("Not after");
formattedMaxDate = new JFormattedTextField(createFormatter("**/**/****"));
JButton btnGetSMSLogs = new JButton("Get SMS");
btnGetSMSLogs.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
fireGetSMS();
}
});
JLabel lblTypeOfSms = new JLabel("Type of SMS :");
typeBox = new JComboBox();
typeBox.setModel(new DefaultComboBoxModel(new String[] {"All", "Unread", "Read"}));
JLabel lblBodyKeyword = new JLabel("Body keyword :");
JScrollPane scrollPane_1 = new JScrollPane();
GroupLayout gl_panel = new GroupLayout(panel);
gl_panel.setHorizontalGroup(
gl_panel.createParallelGroup(Alignment.LEADING)
.addGroup(Alignment.TRAILING, gl_panel.createSequentialGroup()
.addContainerGap()
.addGroup(gl_panel.createParallelGroup(Alignment.TRAILING)
.addComponent(scrollPane_1, Alignment.LEADING, GroupLayout.DEFAULT_SIZE, 238, Short.MAX_VALUE)
.addComponent(btnGetSMSLogs, Alignment.LEADING, GroupLayout.DEFAULT_SIZE, 238, Short.MAX_VALUE)
.addComponent(lblTypeOfCall, Alignment.LEADING)
.addComponent(sourceBox, Alignment.LEADING, 0, 238, Short.MAX_VALUE)
.addComponent(lblPhoneNumber, Alignment.LEADING)
.addComponent(phoneNumberField, GroupLayout.DEFAULT_SIZE, 238, Short.MAX_VALUE)
.addComponent(lblMinDate, Alignment.LEADING, GroupLayout.DEFAULT_SIZE, 238, Short.MAX_VALUE)
.addComponent(formattedMinDate, Alignment.LEADING, GroupLayout.DEFAULT_SIZE, 238, Short.MAX_VALUE)
.addComponent(lblNotAfter, Alignment.LEADING)
.addComponent(formattedMaxDate, Alignment.LEADING, GroupLayout.DEFAULT_SIZE, 238, Short.MAX_VALUE)
.addComponent(lblTypeOfSms, Alignment.LEADING)
.addComponent(typeBox, Alignment.LEADING, 0, 238, Short.MAX_VALUE)
.addComponent(lblBodyKeyword, Alignment.LEADING))
.addContainerGap())
);
gl_panel.setVerticalGroup(
gl_panel.createParallelGroup(Alignment.LEADING)
.addGroup(gl_panel.createSequentialGroup()
.addComponent(lblTypeOfCall)
.addPreferredGap(ComponentPlacement.RELATED)
.addComponent(sourceBox, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
.addPreferredGap(ComponentPlacement.UNRELATED)
.addComponent(lblPhoneNumber)
.addPreferredGap(ComponentPlacement.RELATED)
.addComponent(phoneNumberField, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
.addPreferredGap(ComponentPlacement.UNRELATED)
.addComponent(lblMinDate)
.addPreferredGap(ComponentPlacement.RELATED)
.addComponent(formattedMinDate, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
.addPreferredGap(ComponentPlacement.UNRELATED)
.addComponent(lblNotAfter)
.addPreferredGap(ComponentPlacement.RELATED)
.addComponent(formattedMaxDate, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
.addPreferredGap(ComponentPlacement.UNRELATED)
.addComponent(lblTypeOfSms)
.addPreferredGap(ComponentPlacement.UNRELATED)
.addComponent(typeBox, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
.addPreferredGap(ComponentPlacement.UNRELATED)
.addComponent(lblBodyKeyword)
.addPreferredGap(ComponentPlacement.RELATED)
.addComponent(scrollPane_1, GroupLayout.DEFAULT_SIZE, 30, Short.MAX_VALUE)
.addPreferredGap(ComponentPlacement.RELATED)
.addComponent(btnGetSMSLogs)
.addGap(5))
);
areaKeyword = new JTextArea();
scrollPane_1.setViewportView(areaKeyword);
panel.setLayout(gl_panel);
setLayout(groupLayout);
}
protected MaskFormatter createFormatter(String s) {
MaskFormatter formatter = null;
try {
formatter = new MaskFormatter(s);
} catch (java.text.ParseException exc) {
}
return formatter;
}
private void fireGetSMS() {
String request = "";
///if(sourceBox.getSelectedIndex() != 0) request += " _id = "+sourceBox.getSelectedIndex();
/*if(!personField.getText().equalsIgnoreCase("")) {
if(request.equals("")) request += " person = '"+personField.getText()+"'";
else request += " and person = '"+personField.getText()+"'";
}*/
if(!phoneNumberField.getText().equalsIgnoreCase("")) {
if(request.equals("")) request += " address = '"+phoneNumberField.getText()+"'";
else request += " and address = '"+phoneNumberField.getText()+"'";
}
if(formattedMinDate.getValue() != null) {
if(!formattedMinDate.getValue().equals(" / / ")) {
System.out.println("Valeur min date : "+formattedMinDate.getValue());
String[] res = ((String) formattedMinDate.getValue()).split("/");
//Date date = new Date(Integer.valueOf(res[0]), Integer.valueOf(res[1]), Integer.valueOf(res[2]));
DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
Date date;
try {
date = (Date)formatter.parse(formattedMinDate.getText());
if(request.equals("")) request += " date > "+date.getTime();
else request += " and date > "+date.getTime();
} catch (ParseException e) {
gui.errLogTxt(new Date().getTime(), "Bad format for minimum date");
}
}
}
if(formattedMaxDate.getValue() != null) {
if(!formattedMaxDate.getValue().equals(" / / ")) {
System.out.println("Valeur min date : "+formattedMaxDate.getValue());
String[] res = ((String) formattedMaxDate.getValue()).split("/");
//Date date = new Date(Integer.valueOf(res[0]), Integer.valueOf(res[1]), Integer.valueOf(res[2]));
DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
Date date;
try {
date = (Date)formatter.parse(formattedMaxDate.getText());
if(request.equals("")) request += " date < "+date.getTime();
else request += " and date < "+date.getTime();
} catch (ParseException e) {
gui.errLogTxt(new Date().getTime(), "Bad format for maximum date");
}
}
}
if(typeBox.getSelectedIndex() != 0) {
if(request.equals("")) request += " read = " + (typeBox.getSelectedIndex()-1);
else request += " and read = " + (typeBox.getSelectedIndex()-1);
}
if(sourceBox.getSelectedIndex() != 0) {
if(request.equals("")) request += " type = " + (sourceBox.getSelectedIndex());
else request += " and type = " + (sourceBox.getSelectedIndex());
}
if(!areaKeyword.getText().equals("")) {
if(request.equals("")) request += "body like '%" + areaKeyword.getText()+"%'";
else request += " and body like '%" + areaKeyword.getText()+"%'";
}
gui.fireGetSMS(request);
}
public void updateSMS(ArrayList<SMSPacket> logsList) {
this.clearPanel();
for(SMSPacket p: logsList) {
String mess = "";
mess += p.getId()+"("+p.getThread_id()+"): ";
if(p.getType() == 1) {
String state;
if(p.getRead()== 1) {
state = "read";
}
else
state = "unread";
mess+="Received("+state+"): ";
}
else
mess+="Sent: ";
mess+=p.getAddress()+"\n";
mess+="Body:\n";
mess+=p.getBody()+"\n--\n";
mess+=new Date(p.getDate()).toString()+"\n\n";
if(p.getType() == 1)
colorPane.append(IN_SMS, mess);
else if(p.getType() == 2)
colorPane.append(OUT_SMS, mess);
}
}
public void addSMS(String txt, Color color) {
colorPane.append(color, txt);
}
public void clearPanel() {
colorPane.setText("");
}
}